// 从中国用户号码使用角度进行号码校验
package e164

import (
	"regexp"
)

type CnDrv struct {
}

// 手机号校验
const chinaMobilePattern = `^(13[0-9]|14[0-9]|15[0-9]|17[0-9]|18[0-9])`

func (drv *CnDrv) IsMobile(tel string) bool {
	b, err := regexp.MatchString(chinaMobilePattern, tel)
	if err != nil {
		return false
	}
	return b
}

// 号码规则算法来自原.net算法
// 1, 如果是以下前缀的，进行前缀替换
// arrayList.Add("12593");
// arrayList.Add("17910");
// arrayList.Add("12520");
// arrayList.Add("12583");
// arrayList.Add("17951");
// arrayList.Add("17911");
// arrayList.Add("10193");
// arrayList.Add("12589");
func (drv *CnDrv) Search(tele string, lookup bool) (string, error) {
	teleLen := len(tele)

	// 号码长度不能小于5位，3位的不能打，比如：110,120,119等
	if teleLen < 5 {
		return "", ErrShortNum
	}

	if lookup {
		switch tele[:5] {
		case "12593", "17910", "12520", "12583", "17951", "17911", "10193", "12589":
			tele = tele[5:]
		}
	}
	// 重新整理
	e164Num := seperateE164Num("86", tele)
	if len(e164Num.ccode) == 0 {
		// 未知的国际号原样返回
		return e164Num.Num(), nil
	}

	tele = e164Num.Num()
	teleLen = len(tele)

	// 手机格式校验
	if drv.IsMobile(tele) {
		if teleLen < 11 {
			return "", ErrShortNum
		}
		if teleLen > 11 {
			return "", ErrLongNum
		}
		return tele, nil
	}

	// 座机校验
	switch teleLen {
	case 5, 9, 10, 11:
		return tele, nil
	default:
		return "", ErrNumLen
	}
}

func init() {
	Register("86", &CnDrv{})
}
